home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 9
/
FM Towns Free Software Collection 9.iso
/
t_os
/
tool
/
vdgear
/
src
/
gui.c
< prev
next >
Wrap
Text File
|
1994-11-16
|
4KB
|
206 lines
/*
* VIDEO・GEAR
* "gui.c"
* by Good-Chy
*/
#include "video.h"
void setmos(int pat)
{
int i,j;
unsigned char ptn1, ptn2;
MOS_disp(0);
MOS_typeRom(pat,0,0,mos_pattern); /* パタ-ンの読み込み */
for (i=2+128 ; i<2+128+128 ; i++) /* ANDパタ-ン作成 */
{
mos_pattern[i+512-128] = mos_pattern[i];
}
for (i=127 ; i>=0 ; i--) /* カラ-デ-タ作成 */
{
ptn1 = ((unsigned char*)mos_pattern)[i+2];
for (j=0 ; j<4 ; j++)
{
switch((ptn1>>((3-j)*2)) & 0x3)
{
case 0: ptn2 = 0x88; break;
case 1: ptn2 = 0xf8; break;
case 2: ptn2 = 0x8f; break;
case 3: ptn2 = 0xff; break;
}
((unsigned char*)mos_pattern)[2+i*4+j] = ptn2;
}
}
if (pat == 81) { MOS_type(2, 0, 0,mos_pattern); }
else { MOS_type(2,15,15,mos_pattern); }
MOS_disp(1);
}
void dummy()
{
MOS_disp(0);
MOS_disp(1);
}
void pro_exit()
{
close();
kana_end();
MOS_end();
SND_end();
exit(0);
}
void close()
{
if (active>0)
{
if (key_flag>0)
{
key_flag--;
if (key_flag == 1)
{
KYB_clrbuf();
KAN_disp(KAN_DISPON);
}
if (key_flag == 0) { key_end(); }
}
BUTTON *p, *wp;
char *bp;
int x1, y1, x2, y2;
bp = win[active].win_buf;
x1 = win[active].wx;
y1 = win[active].wy;
x2 = win[active].dx;
y2 = win[active].dy;
wp = p = win[active].item;
while(p != NULL)
{
wp = p;
p = wp->next;
free(wp);
}
EGB_writePage(egb_work,0);
put_vram(bp,x1,y1,x1+x2,y1+y2);
active--;
free(bp);
}
else /* 終了 */
{
con_win(0);
}
}
BUTTON *create(BUTTON *wp, int bx, int by, int dx, int dy,
int type, void (*func)())
{
BUTTON *p;
int wx,wy;
wx = win[active].wx;
wy = win[active].wy;
p = (BUTTON *)malloc(sizeof(BUTTON)); /*次の構造体へのポインタ*/
wp->next = p; /*チェイン*/
(*p).number = wp->number + 1; /* ボタンの番号 */
(*wp).bx = wx+bx; /* ボタンの座標 */
(*wp).by = wy+by;
(*wp).dx = wx+bx+dx;
(*wp).dy = wy+by+dy;
(*wp).type = type; /* ボタンの種類 */
(*wp).function = func; /* ボタンの処理プログラム */
if (func == close)
{
wp->next = NULL;
free(p);
return NULL;
}
return p;
}
BUTTON *window_open(int x1, int y1, int x2, int y2, int tx, int ty)
{
BUTTON *wp;
char *bp;
if (key_flag == 2) { KAN_disp(KAN_DISPOFF); }
active++;
win[active].wx = x1;
win[active].wy = y1;
win[active].dx = x2;
win[active].dy = y2;
bp = get_vram(16,x1,y1,x1+x2,y1+y2); /* 画面退避 */
win[active].win_buf = bp;
EGB_writePage(egb_work,0x80);
bp = get_vram(16,tx,ty,tx+x2,ty+y2); /* TIFF読み込み */
EGB_writePage(egb_work,0);
put_vram(bp,x1,y1,x1+x2,y1+y2); /* 表示 */
free(bp);
wp = (BUTTON *)malloc(sizeof(BUTTON));
win[active].item = wp;
(*wp).number = 0;
return wp;
}
BUTTON *check_button(int x, int y)
{
BUTTON *p;
p = win[active].item;
while(p != NULL)
{
if ((x>=(p->bx)) && (x<=(p->dx)) && (y>=(p->by)) && (y<=(p->dy)))
{ return p; }
p = p-> next;
}
return NULL;
}
void drow(BUTTON *p)
{
int type;
WORD(para+0) = p->bx;
WORD(para+2) = p->by;
WORD(para+4) = p->dx;
WORD(para+6) = p->dy;
type = p->type;
EGB_color(egb_work,0,15); /* 枠の色 */
EGB_color(egb_work,2,15); /* 中塗色 */
EGB_writeMode(egb_work,4); /* 描写モ-ド XOR */
switch(type)
{
case 0: case 2:
{
EGB_paintMode(egb_work,2); /* 境界ベタ塗り */
break;
}
case 1:
{
EGB_paintMode(egb_work,0x22); /* 境界,面塗り ベタ塗り */
break;
}
}
MOS_disp(0);
EGB_rectangle(egb_work,para);
MOS_disp(1);
EGB_writeMode(egb_work,0);
}